#include"src/include/ThreadPool.h"
#include"error.h"
#include"recivedata.h"


ThreadPool::ThreadPool(int size):stop(false)
{
    for(int i = 0;i<size;i++){
        threds.emplace_back(std::thread([this](){ // 利用正则表达式来构建每个线程的工作函数
            while (true)
            {
                std::function<void()> task;
                {//对这个作用阈中的数据进行加锁 防止线程紊乱
                    std::unique_lock<std::mutex> lock(task_mutex);
                    cv.wait(lock,[this]{
                        return stop||!tasks.empty();
                    });
                    if(stop && tasks.empty()) return;
                    task = tasks.front();
                    tasks.pop();
                }
                task();
            } 
        }));
    }
}

ThreadPool::~ThreadPool()
{
    {
       std::unique_lock<std::mutex> look(task_mutex); 
       stop = true;
    }
    cv.notify_all();
    for(std::thread &th:threds){
        if(th.joinable()){
            th.join();
        }
    }

}

void ThreadPool::addFunc(std::function<void()> func)
{
    {
        std::unique_lock<std::mutex> lock(task_mutex);
        if(stop){
            // throw std::__throw_runtime_error("trhead already stop");
        }
        tasks.emplace(func);
    }
    cv.notify_one();
}

// threadpool.cpp
void ThreadPool::stopPool()
{
    {
        std::unique_lock<std::mutex> lock(task_mutex);
        stop = true;
        cv.notify_all(); // 唤醒所有等待的线程
    }

    // 等待所有线程完成当前任务
    for(std::thread &th:threds){
        if(th.joinable()){
            if (th.joinable()) {
                th.detach(); // 超时后分离线程，避免阻塞
            }
//            ReceiveData::getInstance().stopFlag = true;
//            th.join();
        }
    }

    // 清空任务队列
    {
        std::unique_lock<std::mutex> lock(task_mutex);
        while (!tasks.empty()) {
            tasks.pop();
        }
    }
}
